Data i Dialog - Uppsala

Arbetsutkast

Author
Affiliation
Magnus Johansson
Published

August 28, 2023

Code
# import item information
itemlabels <- read_excel("data/RegUaItemlabels.xls", sheet = 2)
spssLabels <- read_excel("data/spssLabels.xls")

# import recoded data
df.all <- read_parquet("/Volumes/magnuspjo/RegionUppsala/data/RegUaLHUdata2023.parquet")
df <- df.all

df <- df %>% 
  mutaterskurs = recode(arskurs,"1='Åk 7';2='Åk 9';3='Gy 2';9=NA;99=NA", as.factor = TRUE),
         Kön = recode(kon,"99=NA;9=NA;2='Flickor';1='Pojkar'", as.factor = T),
         Kommun = recode(skolkommun,"1='Enköping';2='Heby';3='Håbo';4='Knivsta';
                             5='Tierp';6='Uppsala';7='Älvkarleby';8='Östhammar'", as.factor = T),
         Skolnamn = str_squish(skola_txt)
         ) %>% 
  renamer = inars)
Code
# define theming

RISEpalette0 <- c("#009ca6", "#e83c63", "#ffe500")

RISEpalette1 <- colorRampPalette(colors = c("#009ca6", "#e83c63", "#ffe500"))(6)
#scales::show_col(RISEpalette1)

RISEpalette2 <- colorRampPalette(colors = c("#009ca6", "#e83c63", "#ffe500"))(8)
#scales::show_col(RISEpalette2)

gender_colors <- c("Pojkar" = "#F5A127", "Flickor" = "#009CA6")
scale_color_gender <- partial(scale_color_manual, values = gender_colors)
scale_fill_gender <- partial(scale_fill_manual, values = gender_colors)

### text sizes
# ax.size <- 10
# title.size <- 12
# legend.size <- 10
# stript.size <- 10

theme_rise <- function(fontfamily = "Lato", axissize = 13, titlesize = 15,
                       margins = 12, axisface = "plain", stripsize = 12,
                       panelDist = 0.6, legendSize = 11, legendTsize = 12, ...) {
  theme_minimal() +
  theme(
    text = element_text(family = fontfamily),
    axis.title.x = element_text(
      margin = margin(t = margins),
      size = axissize
    ),
    axis.title.y = element_text(
      margin = margin(r = margins),
      size = axissize
    ),
    plot.title = element_text(
      face = "bold",
      size = titlesize
    ),
    axis.title = element_text(
      face = axisface
    ),
    plot.caption = element_text(
      face = "italic"
    ),
    legend.text = element_text(family = fontfamily, size = legendSize),
    legend.title = element_text(family = fontfamily, size = legendTsize),
    legend.background = element_rect(color = "lightgrey"),
    strip.text = element_text(size = stripsize),
    strip.background = element_rect(color = "lightgrey"),
    panel.spacing = unit(panelDist, "cm", data = NULL),
    ...
  )
}

    # these rows are for geom_text() and geom_text_repel() to match font family
    # update_geom_defaults("text", list(family = fontfamily)) +
    # update_geom_defaults("text_repel", list(family = fontfamily)) +
    # update_geom_defaults("textpath", list(family = fontfamily)) +
    # update_geom_defaults("texthline", list(family = fontfamily))

1 Introduktion

Vi har data från enkäten Liv och Hälsa Ung (LHU) från årskurs 7, 9 och 2:an i gymnasiet.

2 Deskriptiva data

Code
df %>% 
  drop_na(Kön) %>% 
  group_by(År,Kön) %>% 
  reframe(Antal = n()) %>% 
  ggplot(aes(x = factor(År), y = Antal, color = Kön, group = Kön)) + 
  geom_line(linewidth = 1) +
  geom_point(size = 3) +
  #geom_point(size = 3) +
  scale_color_gender() +  
  scale_x_discrete('Årtal', guide = guide_axis(n.dodge = 1)) +
  scale_y_continuous(limits = c(0,NA)) +
  labs(title = "Antal respondenter per år",
       subtitle = "Fördelat på kön") +
  theme_rise()

Code
df %>% 
  drop_na(Kön,Kommun) %>% 
  group_by(År,Kommun,Kön) %>% 
  reframe(Antal = n()) %>% 
  ggplot(aes(x = factor(År), y = Antal, color = Kön, group = Kön)) + 
  geom_line(linewidth = 0.9) +
  geom_point(size = 1.7) +
  #geom_point(size = 3) +
  scale_color_manual(values = RISEpalette1[c(1,5)]) +
  scale_x_discrete('Årtal', guide = guide_axis(n.dodge = 2)) +
  scale_y_continuous(limits = c(0,NA)) +
  labs(title = "Antal respondenter per år",
       subtitle = "Fördelat på skolkommun och kön",
       caption = "OBS att y-axlarna kan variera mellan kommunerna.") +
  theme_rise() +
  facet_wrap(~Kommun,
             scales = "free")

Kommer senare.

3 Utsatthet i skolan

Vi börjar med att titta på frågor relaterade till våld och kränkning/mobbning/trakasserier i skolan.

Code
items.kr <- c("C2_1","C2_3","C2_4","C2_5","C2_6","C2_8")

itemlabels %>% 
  filter(itemnr %in% items.kr) %>% 
  kbl_rise(width = 45)
itemnr item
C2_1 Mobbning är ett problem i skolan
C2_3 Sexuella trakasserier är ett problem i skolan
C2_4 Våld är ett problem i skolan
C2_5 Pojkar får bättre möjligheter än flickor
C2_6 Flickor får bättre möjligheter än pojkar
C2_8 Skolan agerar om en elev mobbar en annan elev

3.1 Svarsfördelning

itemnr item
C2_1 Mobbning är ett problem i skolan
C2_3 Sexuella trakasserier är ett problem i skolan
C2_4 Våld är ett problem i skolan
C2_5 Pojkar får bättre möjligheter än flickor
C2_6 Flickor får bättre möjligheter än pojkar
C2_8 Skolan agerar om en elev mobbar en annan elev
Code
df %>% 
  filter(År == 2021) %>% 
  select(all_of(items.kr)) %>% 
  mutate(across(where(is.factor), ~ fct_rev(.x))) %>% 
  RIbarstack() + 
  scale_fill_viridis_d('Svarskategori',
                       direction = -1,
                       labels = ~ stringr::str_wrap(.x, width = 15)) +
  theme_rise() +
  labs(title = "Svarsfördelning",
       subtitle = "Samtliga respondenter 2021.",
       x = "Antal svar") +
  scale_y_discrete(labels = paste0(items.kr, " - ", str_wrap(itemlabels %>% filter(itemnr %in% items.kr) %>% pull(item), 15)))

Det verkar vara ett ganska stort antal “Vet inte”. Vi provar att koda om dem som saknade svar för att få en bättre bild av den faktiska svarsfördelningen. Senare kan vi bl.a. titta på antalet “Vet inte” per fråga över tid.

Code
df %>% 
  filter(År == 2021) %>% 
  select(all_of(items.kr)) %>% 
  filter(!if_any(contains("C2"), ~ str_detect(.x, "Vet inte"))) %>%
  mutate(across(where(is.factor), ~ fct_rev(.x))) %>% 
  RIbarstack() + 
  scale_fill_viridis_d('Svarskategori',
                       direction = -1,
                       labels = ~ stringr::str_wrap(.x, width = 15)) +
  theme_rise() +
  labs(title = "Svarsfördelning",
       subtitle = "Samtliga respondenter 2021.",
       x = "Antal svar") +
  scale_y_discrete(labels = str_wrap(itemlabels %>% filter(itemnr %in% items.kr) %>% pull(item), 15)) 

Code
colG <- df %>% 
  filter(År == 2021) %>% 
  drop_na(Kön) %>% 
  select(all_of(items.kr),Kön) %>%
  filter(!if_any(contains("C2"), ~ str_detect(.x, "Vet inte"))) %>%
  #mutate(across(where(is.factor), ~ fct_rev(.x))) %>% 
  pivot_longer(starts_with("C2"), names_to = "itemnr", values_to = "svarskategori") %>% 
  group_by(Kön) %>% 
  count(itemnr, svarskategori) %>%
  mutate(Nf = factor(n)) %>%
  mutate(svarskategori = fct_rev(svarskategori)) %>% 
  left_join(.,itemlabels, by = "itemnr") %>% 
  ggplot(
    aes(
      x = svarskategori, y = n, fill = Kön
    )
  ) +
  geom_col(position = "dodge") +
  scale_color_manual("",
    values = RISEpalette1[c(1,5)],
    aesthetics = c("fill", "color")
  ) +
    scale_y_continuous(position = "right",
                     label = scales::label_comma(accuracy = 1),
                     minor_breaks = NULL) +
    facet_wrap(~ item,
             dir = "v",
             ncol = 1,
             strip.position = "left",
             #labeller = labeller(str_wrap(itemlabels %>% filter(itemnr %in% items.kr) %>% pull(item), 15))
             labeller = labeller(item = label_wrap_gen(22))
             #scales = "free"
             ) +
  theme_rise(stripsize = 10, 
                strip.text.y.left = element_text(angle = 0),
                legend.position = "top",
                axis.text.y = element_blank()) +  
  xlab("") +
  ylab("") +
  scale_x_discrete(labels = ~ stringr::str_wrap(.x, width = 8))
Code
densityG <- df %>%
  filter(År == 2021) %>% 
  drop_na(Kön) %>% 
  select(all_of(items.kr),Kön) %>%
  filter(!if_any(contains("C2"), ~ str_detect(.x, "Vet inte"))) %>%
  #mutate(across(where(is.factor), ~ fct_rev(.x))) %>% 
  pivot_longer(starts_with("C2"), names_to = "item", values_to = "svarskategori") %>% 
  mutate(svar = as.numeric(svarskategori)) %>% 
  mutate(item = factor(item)) %>% 
  #mutate(item = fct_rev(item)) %>% 
  ggplot(
    aes(
      x = svar, fill = Kön, color = Kön
    )) +
  geom_density(alpha = 0.6, stat = "count") +
  facet_wrap(~ item,
             dir = "v",
             ncol = 1) +
  scale_x_continuous(limits = c(1,5), 
                     breaks = c(1:5)
                     ) +
  scale_y_continuous(minor_breaks = NULL) +
  scale_color_manual('Kön',
    values = RISEpalette1[c(1,5)],
    aesthetics = c("fill", "color")
  ) +
  theme_rise(stripsize = 9) +
  xlab("") +
  ylab("") +
  theme(legend.position = "none") +
  theme(
    axis.text.x = element_blank(), # remove text from both axes
    axis.text.y = element_blank(),
    axis.title = element_blank(),
    strip.text = element_blank()
  ) +
  scale_x_reverse()
Code
library(patchwork)
#| fig-height: 11
#| fig-width: 9

p20cols <- colG + 
  theme(plot.margin = unit(c(0,0,0,0), 'cm'))
p20dens <- densityG + 
  theme(plot.margin = unit(c(0,0,0,0), 'cm'))
# unit(c(top, right, bottom, left), units)
p20cols + p20dens + plot_layout(widths = c(2.3, 1),
                                heights = )

Code
df %>% 
  select(all_of(items.kr),År,Kön) %>% 
  filter(År >= 2013) %>% 
  drop_na(Kön) %>% 
  pivot_longer(items.kr, names_to = "Item", values_to = "Svarskategori") %>% 
  group_by(År,Kön,Item) %>% 
  count(Svarskategori) %>% 
  mutate(Andel = 100 * n / sum(n)) %>% 
  filter(Svarskategori %in% c("Vet inte",NA)) %>% 
  ggplot(aes(x = factor(År), y = Andel, group = Kön, color = Kön, fill = Kön)) +
  geom_point(size = 2.2, alpha = 0.85) +
  geom_line(linewidth = 1.4, alpha = 0.85) +
  #scale_y_continuous(limits = c(0,100), breaks = c(0,20,40,60,80,100)) +
  scale_color_manual(values = RISEpalette1[c(1,5)])  +
    labs(title = "Andel som svarat 'Vet inte' eller saknar svar",
       subtitle = "Samtliga årskurser") +
  ylab("Andel respondenter i procent") +
  xlab("Årtal") +
  theme_rise() +
  facet_grid(Item~Svarskategori,
             switch = "y")

Code
df %>% 
  select(all_of(items.kr),År,Årskurs) %>% 
  filter(År >= 2013) %>% 
  drop_na(Årskurs) %>% 
  pivot_longer(items.kr, names_to = "Item", values_to = "Svarskategori") %>% 
  group_by(År,Årskurs,Item) %>% 
  count(Svarskategori, .drop = F) %>% 
  mutate(Andel = 100 * n / sum(n)) %>% 
  filter(Svarskategori %in% c("Vet inte",NA)) %>% 
  ggplot(aes(x = factor(År), y = Andel, group = Årskurs, color = Årskurs, fill = Årskurs)) +
  geom_point(size = 2.2,
             alpha = 0.85) +
  geom_line(linewidth = 1.4,
            alpha = 0.85) +
  #scale_y_continuous(limits = c(0,100), breaks = c(0,20,40,60,80,100)) +
  scale_color_manual(values = RISEpalette1[c(1,3,5)])  +
    labs(title = "Andel som svarat 'Vet inte' eller saknar svar",
       subtitle = "Samtliga respondenter, uppdelat på årskurs") +
  ylab("Andel respondenter i procent") +
  xlab("Årtal") +
  theme_rise() +
  facet_grid(Item~Svarskategori,
             switch = "y") +
  coord_cartesian(clip = "off")

Code
items.kr <- c("C2_1","C2_3","C2_4","C2_5","C2_6","C2_8")

df.omit.na <- df %>% 
  select(all_of(items.kr),Kön,Årskurs) %>% 
  mutate(across(starts_with("C2"), ~ recode(.x,"'Stämmer mycket dåligt'=0;
                    'Stämmer ganska dåligt'=1;
                    'Stämmer varken bra eller dåligt'=2;
                    'Stämmer ganska bra'=3;
                    'Stämmer mycket bra'=4;
                    'Vet inte'=NA",
                    as.factor = FALSE)
  )) %>% 
  mutate(C2_8 = recode(C2_8,"4=0;3=1;1=3;0=4", as.factor = F)) %>%  # reverse code one item
  na.omit()

# create DIF vector variables
dif.kön <- df.omit.na$Kön
dif.årskurs <- df.omit.na$Årskurs

# remove from item dataframe
df.omit.na$Kön <- NULL
df.omit.na$Årskurs <- NULL

3.2 Enskilda C2-frågor över tid

Code
# prepare dataframe
df.c2 <- df %>%
  drop_na(Kön, Årskurs) %>%
  select(all_of(items.kr), Kön, År, Årskurs) %>%
  filter(!if_any(contains("C2"), ~ str_detect(.x, "Vet inte"))) %>%
  pivot_longer(starts_with("C2"), names_to = "itemnr", values_to = "svarskategori") %>%
  group_by(År, Årskurs, Kön, itemnr) %>%
  count(svarskategori) %>%
  mutate(svarskategori = fct_rev(svarskategori)) %>%
  mutate(
    Andel = round(100 * n / sum(n), 1),
    År = factor(År)
  ) %>%
  ungroup() %>%
  left_join(., itemlabels, by = "itemnr")

# define function to create figures
categoriesTime <- function(data, årskurs) {
  data %>%
    filter(Årskurs == {{ årskurs }}) %>%
    ggplot(
      aes(
        x = År, y = Andel, color = svarskategori, group = svarskategori
      )
    ) +
    geom_point() +
    geom_line() +
    theme_rise(stripsize = 11) +
    scale_y_continuous(limits = c(0,100)) +
    scale_color_viridis_d("", option = "plasma", end = 0.9,
      labels = ~ stringr::str_wrap(.x, width = 12)
    ) +
    labs(title = paste0(årskurs),
         y = "") +
    facet_grid(item ~ Kön,
      labeller = label_wrap_gen(width = 25, multi_line = TRUE)
    ) +
    theme(
      legend.position = "bottom",
      legend.justification = "left",
      strip.text.y.right = element_text(angle = 0)
      #panel.background = element_rect(fill = "#f9f9f9"),
      #panel.grid.major = element_line(color = "grey")
    )
}

Svarsalternativet i mitten (“Stämmer varken bra eller dåligt”) visas ej.

Code
df.c2 %>% 
  filter(!svarskategori == "Stämmer varken bra eller dåligt") %>% 
  categoriesTime("Åk 7")

Code
df.c2 %>% 
  filter(!svarskategori == "Stämmer varken bra eller dåligt") %>% 
  categoriesTime("Åk 9")

Code
df.c2 %>% 
  filter(!svarskategori == "Stämmer varken bra eller dåligt") %>% 
  categoriesTime("Gy 2")

De två positiva och de två negativa läggs samman för en enklare vy nedan.

Code
# prepare dataframe with merged response categories
df.c2.merged <- df.c2 %>%
  select(!n) %>%
  pivot_wider(
    names_from = svarskategori,
    values_from = Andel
  ) %>%
  clean_names() %>% 
  mutate(pos_svar = stammer_mycket_bra+stammer_ganska_bra,
         neg_svar = stammer_ganska_daligt+stammer_mycket_daligt) %>%
  select(ar,arskurs,kon,item,pos_svar,neg_svar) %>% 
  pivot_longer(c("pos_svar","neg_svar"),
               names_to = "svarskategori",
               values_to = "Andel") %>% 
  renamer = ar,
         Årskurs = arskurs,
         Kön = kon) %>% 
  mutate(svarskategori = car::recode(svarskategori,"'pos_svar'='Positiva svar';
                                     'neg_svar'='Negativa svar'"))
Code
categoriesTime(df.c2.merged,"Åk 7")

Code
categoriesTime(df.c2.merged,"Åk 9")

Code
categoriesTime(df.c2.merged,"Gy 2")

En ansats till att tydliggöra könsskillnader.

Code
catTimeComp <- function(data, posneg) {
  data %>%
    filter(svarskategori == {{ posneg }}) %>%
    ggplot(
      aes(
        x = År, y = Andel, color = Kön, group = Kön
      )
    ) +
    geom_point() +
    geom_line() +
    theme_rise(stripsize = 11) +
    scale_y_continuous(limits = c(0, 100)) +
    scale_x_discrete(guide = guide_axis(n.dodge = 2)) +
    scale_color_gender() +
    labs(title = paste0(posneg)) +
    theme(
      legend.position = "bottom",
      legend.justification = "left",
      strip.text.y.right = element_text(angle = 0)
    ) +
  facet_grid(item ~ Årskurs,
    labeller = label_wrap_gen(width = 25, multi_line = TRUE),
    scales = "free_x"
  )
}
Code
catTimeComp(df.c2.merged,"Negativa svar")

Code
catTimeComp(df.c2.merged,"Positiva svar")

4 KOLADA

Det blir grötigt med 8 kommuner i samma figur. Det går fint att varje kommun väljer ut (exempelvis) 3 kommuner att jämföra sig med, om man vill förenkla.

Code
KOLADA <- read_parquet("data/2023-03-28_KOLADA_data_ready.parquet")
Municipalities <- read_parquet("data/2023-03-28_KOLADA_Municipality_list.parquet")

UppsalaLänsKommuner <- Municipalities %>% 
  filter(str_detect(id,"^03")) %>% 
  pull(title)

kpi_mean <- KOLADA %>%
  group_by(KPI, kpi, År) %>%
  summarise_at(vars(Andel), list(Andel = mean)) %>%
  add_column(Kommun = "Medel riket", .before = "KPI") %>%
  add_column(Kön = "Alla")

KOLADA <- rbind(KOLADA, kpi_mean)

KOLADA <- KOLADA %>% 
  filter(Kommun %in% UppsalaLänsKommuner,
         År > 2009)


DIDkoladaPlot <- function(data) {
  data %>%
  ggplot(aes(x = År, y = Andel, group = Kommun, color = Kommun)) +
    geom_line(alpha = 0.5, linewidth = 0.8, linetype = 3) +
    geom_point(alpha = 0.5, size = 2) +
    geom_line(data = filter({{data}}, Kommun == fokusKommun), alpha = 1) +
    geom_point(data = filter({{data}}, Kommun == fokusKommun), alpha = 1) +
    geom_smooth(method = "lm",
                aes(group = 1),
                alpha = 0.12,
                color = "darkblue",
                linewidth = 0,
                linetype = 2) +
    scale_x_continuous(guide = guide_axis(n.dodge = 2), 
                       breaks = seq(2010, 2022, 2)) +
    #scale_y_continuous(limits = c(0, 100)) +
    scale_color_brewer(type = "qual", palette = "Dark2") +
    ylab("Andel i %") +
    xlab("") +
    facet_wrap(~KPI,
               ncol = 2,
               scales = "free",
               labeller = labeller(KPI = label_wrap_gen(22))) +
    theme_rise(stripsize = 10) +
    theme(legend.position = "top") +
    labs(caption = "Ljusgrått fält visar en oviktad trendlinjes 95% konfidensintervall.\nDatakälla: Kolada")
}

DIDkoladaPlotG <- function(data) {
  data %>%
    mutate(Kön = fct_rev(Kön)) %>% 
  ggplot(aes(x = År, y = Andel, group = Kön, color = Kön)) +
    geom_line(alpha = 0.8, linewidth = 0.8) +
    geom_point(alpha = 0.8, size = 1.6) +
    #geom_line(data = filter({{data}}, Kommun == fokusKommun), alpha = 1) +
    #geom_point(data = filter({{data}}, Kommun == fokusKommun), alpha = 1) +
    geom_smooth(method = "lm",
                aes(group = 1),
                alpha = 0.12,
                color = "darkblue",
                linewidth = 0,
                linetype = 2) +
    scale_x_continuous(guide = guide_axis(n.dodge = 2), 
                       breaks = seq(2010, 2022, 2)) +
    #scale_y_continuous(limits = c(0, 100)) +
    scale_color_manual(values = RISEpalette1[c(1,5)])  +
    ylab("Andel i %") +
    xlab("") +
    facet_grid(Kommun~KPI,
               scales = "free",
               labeller = labeller(KPI = label_wrap_gen(22))) +
    theme_rise(stripsize = 10) +
    theme(legend.position = "top") +
    labs(caption = "Ljusgrått fält visar en oviktad trendlinjes 95% konfidensintervall.\nDatakälla: Kolada")
}
Code
KOLADA %>% 
  filter(Kön == "Alla") %>% 
  filter(KPI %in% c("Barn 3-5 år inskrivna i förskola, andel (%)",
                    "Heltidstjänster i förskola med pedagogisk högskoleexamen, lägeskommun, andel (%)",
                    "Heltidstjänster i förskola med pedagogisk högskoleexamen, enskild regi, andel (%)",
                    "Heltidstjänster i förskola med pedagogisk högskoleexamen, kommunal regi, andel (%)")
  ) %>% 
  DIDkoladaPlot() + scale_y_continuous(limits = c(0, 100))

Code
KOLADA %>% 
  filter(Kön == "Alla") %>% 
  filter(KPI %in% c("Barn 3-5 år inskrivna i förskola, andel (%)",
                    "Heltidstjänster i förskola med pedagogisk högskoleexamen, lägeskommun, andel (%)",
                    "Heltidstjänster i förskola med pedagogisk högskoleexamen, enskild regi, andel (%)",
                    "Heltidstjänster i förskola med pedagogisk högskoleexamen, kommunal regi, andel (%)")
  ) %>% 
  DIDkoladaPlot()

Code
KOLADA %>% 
  filter(Kön == "Alla") %>% 
  filter(KPI %in% c("Lärare med pedagogisk högskoleexamen i grundskola åk 1-9, lägeskommun, andel (%)",
                    "Lärare (heltidstjänster) med lärarlegitimation och behörighet i minst ett ämne i grundskola åk 1-9, lägeskommun, andel (%)",
                    "Elever i åk 9 som är behöriga till yrkesprogram, hemkommun, andel (%)",
                    "Elever vars föräldrar har eftergymnasial utbildning, åk 1-9 i lägeskommun, andel (%)")
  ) %>% 
  DIDkoladaPlot() + scale_y_continuous(limits = c(0, 100))

Code
KOLADA %>% 
  filter(Kön == "Alla") %>% 
  filter(KPI %in% c("Lärare med pedagogisk högskoleexamen i grundskola åk 1-9, lägeskommun, andel (%)",
                    "Lärare (heltidstjänster) med lärarlegitimation och behörighet i minst ett ämne i grundskola åk 1-9, lägeskommun, andel (%)",
                    "Elever i åk 9 som är behöriga till yrkesprogram, hemkommun, andel (%)",
                    "Elever vars föräldrar har eftergymnasial utbildning, åk 1-9 i lägeskommun, andel (%)")
  ) %>% 
  DIDkoladaPlot()

Code
KOLADA %>% 
  filter(Kön == "Alla") %>% 
  filter(KPI %in% c("Lärare med pedagogisk högskoleexamen i gymnasieskola, lägeskommun, andel (%)",
                    "Gymnasieelever som uppnått grundläggande behörighet till universitet och högskola inom 4 år, hemkommun, andel (%)",
                    "Gymnasieelever med indraget studiestöd pga. ogiltig frånvaro, hemkommun, andel (%)")
  ) %>% 
  DIDkoladaPlot() + scale_y_continuous(limits = c(0, 100))

Code
KOLADA %>% 
  filter(Kön == "Alla") %>% 
  filter(KPI %in% c("Lärare med pedagogisk högskoleexamen i gymnasieskola, lägeskommun, andel (%)",
                    "Gymnasieelever som uppnått grundläggande behörighet till universitet och högskola inom 4 år, hemkommun, andel (%)",
                    "Gymnasieelever med indraget studiestöd pga. ogiltig frånvaro, hemkommun, andel (%)")
  ) %>% 
  DIDkoladaPlot()

Code
KOLADA %>%
  filter(Kön == "Alla") %>%
  filter(KPI %in% c(
    "Deltagartillfällen i idrottsföreningar, antal/inv 7-20 år",
    "Deltagartillfällen i idrottsföreningar, antal/inv 13-20 år",
    "Aktivitetstillfällen för barn och unga i kommunala bibliotek, antal/1000 inv 0-18 år",
    "Elever i musik- eller kulturskola, 6-15 år, andel (%)"
  )) %>% 
  DIDkoladaPlot() + scale_y_continuous(limits = c(0, 100))

Code
KOLADA %>%
  filter(Kön == "Alla") %>%
  filter(KPI %in% c(
    "Deltagartillfällen i idrottsföreningar, antal/inv 7-20 år",
    "Deltagartillfällen i idrottsföreningar, antal/inv 13-20 år",
    "Aktivitetstillfällen för barn och unga i kommunala bibliotek, antal/1000 inv 0-18 år",
    "Elever i musik- eller kulturskola, 6-15 år, andel (%)"
  )) %>% 
  DIDkoladaPlot()

Code
KOLADA %>%
  filter(Kön %in% c("Flicka","Pojke")) %>%
  filter(KPI %in% c(
    "Deltagartillfällen i idrottsföreningar, antal/inv 7-20 år",
    "Deltagartillfällen i idrottsföreningar, antal/inv 13-20 år",
    "Aktivitetstillfällen för barn och unga i kommunala bibliotek, antal/1000 inv 0-18 år",
    "Elever i musik- eller kulturskola, 6-15 år, andel (%)"
  )) %>% 
  DIDkoladaPlotG()

Code
KOLADA %>% 
  filter(Kön == "Alla") %>% 
  filter(KPI %in% c("Invånare 0-19 år i ekonomiskt utsatta hushåll, andel (%)",
                    "Trångboddhet i flerbostadshus, enligt norm 2, andel (%)",
                    "Trångboddhet i flerbostadshus, enligt norm 3, andel (%)",
                    "Anmälda brott om skadegörelse per 1 000 inv.",
                    "Anmälda stöld- och tillgreppsbrott, antal/1000 inv")
  ) %>% 
  DIDkoladaPlot() + scale_y_continuous(limits = c(0, 100))

Code
KOLADA %>% 
  filter(Kön == "Alla") %>% 
  filter(KPI %in% c("Invånare 0-19 år i ekonomiskt utsatta hushåll, andel (%)",
                    "Trångboddhet i flerbostadshus, enligt norm 2, andel (%)",
                    "Trångboddhet i flerbostadshus, enligt norm 3, andel (%)",
                    "Anmälda brott om skadegörelse per 1 000 inv.",
                    "Anmälda stöld- och tillgreppsbrott, antal/1000 inv")
  ) %>% 
  DIDkoladaPlot()

5 Temafrågor om kränkning

Code
itemlabels %>% 
  filter(str_detect(itemnr,"TEMA3")) %>% 
  kbl_rise(width = 45)
itemnr item
TEMA3_F1_1 hånad, retad, utfryst?
TEMA3_F1_2 knuffad, fasthållen, utan att du blev fysiskt skadad?
TEMA3_F1_3 ofrivilligt kysst, tafsad på, talad till, fotad eller filmad, på ett sexuellt och oönskat sätt?
TEMA3_F1_4 bestulen eller lurad på pengar eller andra värdesaker?
TEMA3_F2_1 hotad eller förföljd, så att du blev rädd?
TEMA3_F2_2 hårt knuffad, hårt fasthållen, slagen eller sparkad så att du blev skadad eller så att det gjorde fysiskt ont?
TEMA3_F2_3 sexuellt utnyttjad, tvingad till sexuella handlingar?
TEMA3_F2_4 inspärrad i ett rum, eller genom hot eller våld tvingad att stanna kvar på ett ställe?

5.1 Deskriptiva data

Code
df %>% 
  select(starts_with("TEMA3_F"),Kön,Kommun) %>% 
  na.omit() %>% 
  group_by(Kommun,Kön) %>% 
  reframe(Antal = n()) %>% 
  mutate(Kommun = fct_reorder(Kommun, desc(Antal))) %>% 
  ggplot(aes(x = Kommun, y = Antal, fill = Kön, group = Kön)) + 
  geom_col(position = "dodge") +
  scale_fill_gender() +  
  scale_x_discrete('Kommun', guide = guide_axis(n.dodge = 1)) +
  scale_y_continuous(limits = c(0,NA)) +
  labs(title = "Antal respondenter per år",
       subtitle = "Fördelat på kön") +
  theme_rise()

Code
tema3f <- df %>% 
  select(starts_with("TEMA3_F"),Kön,Kommun) %>% 
  na.omit() %>% 
  mutate(across(
    starts_with(c("tema3_f1","tema3_f2")), 
      ~ recode(.x,"1='Nej, det har inte hänt';
      2='Ja, någon eller några gånger';
      3='Ja, några gånger i månaden';
      4='Ja, några gånger i veckan';
      5='Ja, nästan varje dag'",
      as.factor = TRUE))
      )

tema3f %>% 
  select(starts_with(c("tema3_f1","tema3_f2"))) %>% 
           RIlistItemsMargin()
itemnr item
TEMA3_F1_1 hånad, retad, utfryst?
TEMA3_F1_2 knuffad, fasthållen, utan att du blev fysiskt skadad?
TEMA3_F1_3 ofrivilligt kysst, tafsad på, talad till, fotad eller filmad, på ett sexuellt och oönskat sätt?
TEMA3_F1_4 bestulen eller lurad på pengar eller andra värdesaker?
TEMA3_F2_1 hotad eller förföljd, så att du blev rädd?
TEMA3_F2_2 hårt knuffad, hårt fasthållen, slagen eller sparkad så att du blev skadad eller så att det gjorde fysiskt ont?
TEMA3_F2_3 sexuellt utnyttjad, tvingad till sexuella handlingar?
TEMA3_F2_4 inspärrad i ett rum, eller genom hot eller våld tvingad att stanna kvar på ett ställe?
Code
tema3f %>% 
  select(starts_with(c("tema3_f1","tema3_f2"))) %>% 
  RIallresp()
Response category Number of responses Percent
Ja, någon eller några gånger 3080 24.1
Ja, några gånger i månaden 685 5.4
Ja, några gånger i veckan 403 3.2
Ja, nästan varje dag 399 3.1
Nej, det har inte hänt 8201 64.2
Code
tema3f %>% 
  select(starts_with(c("tema3_f1","tema3_f2")),Kön,Kommun) %>% 
  pivot_longer(starts_with(c("tema3_f1","tema3_f2")),
               names_to = "item",
               values_to = "svarskategori") %>% 
  #mutate(svarskategori = fct_reorder(desc("svarskategori"))) %>% 
  ggplot(aes(x = svarskategori, fill = Kön)) +
  geom_bar(position = "dodge") +
  scale_fill_gender() +
  theme_rise() +
  scale_x_discrete('Svarskategori', guide = guide_axis(n.dodge = 3)) +
  facet_wrap(~item,
             labeller = labeller(item = label_wrap_gen(8))
             ) +
  labs(y = "Antal")

  • 1 Nej, det har inte hänt
  • 2 Ja, någon eller några gånger
  • 3 Ja, några gånger i månaden
  • 4 Ja, några gånger i veckan
  • 5 Ja, nästan varje dag

6 Trygghet och trivsel i skolan

Det finns en fråga om trivsel som kan redovisas liknande “Hur mår du rent allmänt?”.

Här kan det finnas möjlighet att ta fram indexvärden, eftersom det finns många frågor som mäter aspekter av detta i MHC-SF. Det medför att en psykometrisk analys behöver göras, se separat dokument.